/*
一个文件的内容仅由大小写英文字母（a至z）组成。
现在我们希望实现一个基本的文件压缩方法。
此方法的基本思想是利用连续相同字符的出现次数
来压缩文件。

例如，文件内容为aabcccccaaa会被压缩为a2b1c5a3。

但是，如果压缩后的文件内容长度不比原文件短，
那么我们选择保留原文件。

请你编写一个方法来实现上述的文件压缩功能。

*/
# include<iostream>
#include <vector>  
struct laq//letter and quantity
{
    char letter;
    int qtt;
};
std::string compressString(std::string S)
{   //S为空
    if (!S.size())
{
    return S;
}

    //S非空
    std::string::iterator sit = S.begin();
    //记录S字符的结构体向量
    std::vector<laq> V;
    //向量迭代器
    std::vector<laq>::iterator vit = V.begin();
    //反向迭代器,求最后一个元素(给qtt++)
    std::vector<laq>::reverse_iterator rvit = V.rbegin();
    //当begin没法和前一个元素比较时设置n为null,其余时候sit前一个
    char n = '\0';

    std::string  str;
    //遍历S,形成一个跳表
    while (sit != S.end())
	{   
        //V的最后一位才会被修改
        rvit = V.rbegin();
        //当前字母不断与上一个比较,一样则转else
		if(n!=*sit){
            //rvit始终指向最后一个元素
            struct laq a {*sit,1};
            V.push_back(a);
        }
        //字母一样仅需要改qtt,rvit不用移动
        else{
            
            rvit->qtt++;
            
        }
		
        n=*sit ;
        sit++;
	}
    //根据跳表生成str
    vit = V.begin();
    while(vit!=V.end()){
    
        str+=vit->letter;
        str+=std::to_string(vit->qtt);
        vit++;
    }
    //比较S和str
    return str.size()<S.size()?str:S;
}

int main()
{   using namespace std;
    
    string str;
    cin >> str;
    cout << compressString(str) << endl;
    return 0;
}